QListWidget实现图片缩略图列表 您所在的位置:网站首页 top widgets费电吗 QListWidget实现图片缩略图列表

QListWidget实现图片缩略图列表

2023-05-25 07:04| 来源: 网络整理| 查看: 265

最近在学PyQt,跟着一个博主学做一个缩略图列表,来查看文件夹内的图片文件

这里项目的原链接:

PyQt5入门——QListWidget实现图片缩略图列表_pyqt5 图片列表_虾米小馄饨的博客-CSDN博客

在此感谢原博主的高质量文章

下面记录自己学习的过程

(一)示例效果

(二)代码实例

其中,需要用到的QListWidget信号:

      itemSelectionChanged:所选项发生变化时发送

(1)先定义缩略图列表部分

继承自QListWidget。每个QListWidgetItem可以设置QIcon图片和文本。

import os from qtpy.QtCore import QSize from qtpy.QtGui import QIcon, QPixmap from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QListView, QWidget, QApplication, QHBoxLayout, QLabel # 定义缩略图列表部分,继承自QListWidget。每一个QListWidgetItem可以设置QIcon图片和文本 class ImageListWidget(QListWidget): # def__init__(self): 用于初始化类,只有一个self,指的是实例本身 def __init__(self): # super()用来调用父类(基类)的方法,__init__()是类的构造方法 # super().__init__() 就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法 super(ImageListWidget, self).__init__() # setFlow 布局方向设定 # QListView类用于展示数据,它的子类是QListWidget self.setFlow(QListView.Flow(1)) # 0: left to right, 1: top to bottom # setIconSize改变单元格中图片的尺寸 self.setIconSize(QSize(150, 100)) def add_image_items(self, image_paths=[]): for img_path in image_paths: # os.path.isfile():判断某一对象(需提供绝对路径)是否为文件 # os.path.isdir():判断某一对象(需提供绝对路径)是否为目录 if os.path.isfile(img_path): # os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 # os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 img_name = os.path.basename(img_path) # QListWidgetItem类为QListWidget类提供构成QListWidget列表部件的项,每个列表部件的项都是一个QListWidgetItem对象 # QIcon类提供了处于不同模式和状态下的可缩放图标。QIcon可以从给定的一组像素图生成较小,较大,激活和禁用等情况小的像素图。Qt窗口部件使用这些像素图来显示代表特定动作的图标。 item = QListWidgetItem(QIcon(img_path), img_name) # item.setText(img_name) # item.setIcon(QIcon(img_path)) self.addItem(item) (2)布局窗体控件

左边区域用QLabel加载图像,右边区域是图片缩略图列表,点击缩略图,可以在左边查看大图。

# 布局窗体控件 # 左边区域用QLabel加载图像,右边区域是图片缩略图列表,点击缩略图,可以在左边查看大图 class ImageViewerWidget(QWidget): def __init__(self): super(QWidget, self).__init__() # 显示控件 self.list_widget = ImageListWidget() # 调用一下上面定义的缩略图列表类 # 设置最小宽度 self.list_widget.setMinimumWidth(200) self.show_label = QLabel(self) # 使用setFixedSize()这个函数的话不能最大化窗口(窗口最大化的按钮会变成灰色),默认不可进行缩小放大,即窗口为确定大小。 self.show_label.setFixedSize(600, 400) self.image_paths = [] self.currentImgIdx = 0 self.currentImg = None # 水平布局 # 采用QBOXLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和QVBoxLayout类继承自QBoxLayout # 采用QHBoxLayout类,按照从左到右的顺序来添加控件 self.layout = QHBoxLayout(self) self.layout.addWidget(self.show_label) self.layout.addWidget(self.list_widget) # 信号与连接 self.list_widget.itemSelectionChanged.connect(self.loadImage) def load_from_paths(self, img_path=[]): self.image_paths = img_paths self.list_widget.add_image_items(img_paths) def loadImage(self): """ 在Qt5的QTabWidget类中,在默认情况下是以0开始作为标签索引值,而currentIndex()函数返回的值指的是 在当前的页面切换的界面中所停留的那一个页面对应的标签索引值。 currentIndex().row()可以获取当前点击单元格所在的行序号,currentIndex().column()可以获取当前点击单元格所在的列序号。 currentIndex().data()可以获取到当前点击单元格的文本; """ self.currentImgIdx = self.list_widget.currentIndex().row() if self.currentImgIdx in range(len(self.image_paths)): """ QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中, 通常是标签或者按钮,用于在标签或按钮上显示图像 QPixmap可以读取的图像文件类型有BMP,GIF,JPG等 """ self.currentImg = QPixmap(self.image_paths[self.currentImgIdx]).scaledToHeight(400) # setPixmap函数显示图片 self.show_label.setPixmap(self.currentImg) (3)加载一些图片路径,并运行窗口 if __name__ == "__main__": import sys app = QApplication(sys.argv) # 图像路径 img_dir = r"D:\Qt\QtData\PyQt\Thumbnail\picture" filenames = os.listdir(img_dir) img_paths = [] for file in filenames: if file[-4:] == ".png" or file[-4:] == ".jpg": img_paths.append(os.path.join(img_dir, file)) # 显示控件 main_widget = ImageViewerWidget() main_widget.load_from_paths(img_paths) main_widget.setWindowTitle("ImageViewer") main_widget.show() # 应用程序运行 sys.exit(app.exec_())

运行效果如下

 到此功能实现



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有